package cn.com.idmy.auth.event;

import cn.com.idmy.auth.login.LoginState;
import lombok.extern.slf4j.Slf4j;


@Slf4j
public class ListenerLogImpl<ID> implements Listener<ID> {

    /**
     * 每次登录时触发
     */
    @Override
    public void doLogin(LoginState<ID> state) {
        log.info("账号「{}」登录成功！账号类型：「{}」 , 会话凭证：「{}」", state.id(), state.accountType(), state.token());
    }

    /**
     * 每次注销时触发
     */
    @Override
    public void doLogout(ID id, String tokenValue) {
        log.info("账号 {} 注销登录 (accountType={}), 会话凭证 token={}", id, tokenValue);
    }

    /**
     * 每次被踢下线时触发
     */
    @Override
    public void doKickOut(ID id, String tokenValue) {
        log.info("账号 {} 被踢下线 (accountType={}), 会话凭证 token={}", id, tokenValue);
    }

    /**
     * 每次被顶下线时触发
     */
    @Override
    public void doReplaced(ID id, String tokenValue) {
        log.info("账号 {} 被顶下线 (accountType={}), 会话凭证 token={}", id, tokenValue);
    }

    /**
     * 每次被封禁时触发
     */
    @Override
    public void doDisable(ID id, String service, int level, long disableTime) {
        log.info("账号 {} [{}服务] 被封禁 (accountType={}), 封禁等级={}, 解封时间为 {}", id, service, level, disableTime * 1000);
    }

    /**
     * 每次被解封时触发
     */
    @Override
    public void doUntieDisable(ID id, String service) {
        log.info("账号 {} [{}服务] 解封成功 (accountType={})", id, service);
    }

    /**
     * 每次打开二级认证时触发
     */
    @Override
    public void doOpenTwo(String tokenValue, String service, long safeTime) {
        log.info("token 二级认证成功, 业务标识={}, 有效期={}秒, Token值={}", service, safeTime, tokenValue);
    }

    /**
     * 每次关闭二级认证时触发
     */
    @Override
    public void doCloseTwo(String tokenValue, String service) {
        log.info("token 二级认证关闭, 业务标识={}, Token值={}", service, tokenValue);
    }

    /**
     * 每次创建Session时触发
     */
    @Override
    public void doCreateSession(String id) {
        log.info("SaSession [{}] 创建成功", id);
    }

    /**
     * 每次注销Session时触发
     */
    @Override
    public void doDeleteSession(String id) {
        log.info("SaSession [{}] 注销成功", id);
    }

    /**
     * 每次Token续期时触发
     */
    @Override
    public void doRenewTimeout(String tokenValue, ID id, long timeout) {
        log.info("token 续期成功, {} 秒后到期, 帐号={}, token值={} ", timeout, id, tokenValue);
    }


    /**
     * 全局组件载入
     *
     * @param componentName 组件名称
     * @param component     组件对象
     */
    @Override
    public void doRegisterComponent(String componentName, Object component) {
        String canonicalName = component == null ? null : component.getClass().getCanonicalName();
        log.info("全局组件 {} 载入成功: {}", componentName, canonicalName);
    }

    /**
     * StpLogic 对象替换
     *
     * @param baseManager /
     */
    @Override
    public void doSetAuthManager(Object baseManager) {
        if (baseManager != null) {
            log.info("会话组件 StpLogic(type={}) 重置成功: {}", baseManager.getClass());
        }
    }

    /**
     * 载入全局配置
     *
     * @param props /
     */
    @Override
    public void doSetGlobalProps(Object props) {
        if (props != null) {
            log.info("全局配置 {} ", props);
        }
    }
}
